#include <iostream>

// 函数重载的底层原理使用了一个叫做名称修饰的东西定位每一个重载函数
// 使用 C++开发工具开发程序的时候,C++编译器将会进行一些神奇的操作-----名称修饰/或者说名称矫正,他根据函数原型中指定的形参类型对每一个函数进行加密
// long myFunction(int , float);           //加密前
// ?myFunction@@YAXH                       //加密后

// 函数重载的关键在于形参列表的不同
// 比如像下面的函数声明：
void print(const char * str, int width);
void print(double d,int width);
void print(long l,int width);
// 上面的参数都没有问题，因为没有二义性

// 不允许这样的重载
// int ground(double d,int i);
// double ground(double d,int i);

void print(int i,int width);
// 一般在这种情况下函数将会拒绝调用,并将其视为错误;  因为和上面的 (long ,int )产生了歧义

double cube(double d,int i);
double cube(double & d,int i);
// 像上面这种样子的 x与double和double &类型都匹配,编译器将会无法确定使用哪一种原型,
// 这里编译器将不会视为重载,而是将引用类型和类型本身视为同一个特征(也就是声明了两次一模一样的......)


// 匹配函数时,应该声明const和 非const变量,就像下面这样
void dribble(char * bits);
void dribble(const char * bits);
// 上面两种声明构成重载 const 和 非cosnt，主要是由于将非const变量 赋值给 const类型变量是合法的，反之不行

int main(){
    using namespace std;
    cout << cube(10,2) << endl;


    return 0;
}